package com.dk.util.file;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.dk.domain.ActionEntity;
import com.dk.domain.ApiEntity;
import com.dk.domain.CaseEntity;
import com.dk.domain.VarEntity;
import com.dk.exception.ExcelDataException;
import com.dk.util.datacheck.ValidatorUtil;
import com.dk.util.log.Log;
import lombok.SneakyThrows;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;

/**
 * excel操作监听器
 */
public class ExcelDataListener<T> extends AnalysisEventListener<T> {
    //存储行对象的集合
    private final List<T> rows = new ArrayList<>();

    /**
     * 解析excel每一行数据都会调用
     * @param row 行对象泛型
     * @param analysisContext 分析上下文
     */
    @SneakyThrows
    @Override
    public void invoke(T row, AnalysisContext analysisContext) {
        //异常map
        Map<String,StringBuffer> errorMap = null;
        //最终返回的异常msg
        StringBuffer errorMsg = new StringBuffer();
        //当row为ApiEntity实例时
        if(row instanceof ApiEntity){
            //获取errorMap数据
            errorMap = ValidatorUtil.validate((ApiEntity)row);
        }else if(row instanceof CaseEntity){
            //获取errorMap数据
            errorMap = ValidatorUtil.validate((CaseEntity)row);
        }else if(row instanceof VarEntity){
            //获取errorMap数据
            errorMap = ValidatorUtil.validate((VarEntity)row);
        }else if(row instanceof ActionEntity){
            //获取errorMap数据
            errorMap = ValidatorUtil.validate((ActionEntity)row);
        }else{
            throw new ExcelDataException("---【error】:未知类型excel数据,请检查测试文件");
        }
        if(errorMap!=null&&errorMap.size()!=0){
            throw new ExcelDataException("---【error】:文件名:"+analysisContext.readWorkbookHolder().getFile().getName()+
                    ";\nsheet:"+analysisContext.readSheetHolder().getSheetName()+
                    ";\n第"+analysisContext.getCurrentRowNum()+"行:"+ValidatorUtil.getErrorMsg(errorMap));
        }
        rows.add(row);
    }

    /**
     * 每一个sheet数据解析完都会调用的方法
     * @param analysisContext 分析上下文
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        Log.info("---【数据加载】:文件名:"+analysisContext.readWorkbookHolder().getFile().getName()+
                "-"+analysisContext.readSheetHolder().getSheetName()+"解析成功");
    }

    /**
     * 返回excel对象集合
     * @return 对象集合
     */
    public List<T> getRows(){
        /**
         * 检查数据准确性
         */
        return rows;
    }
}
